package com.lingjtx.common.api.config;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.lingjtx.common.core.ResponseCode;
import com.lingjtx.common.core.exception.ResponseErrorException;
import com.lingjtx.common.core.token.UserVo;
import com.lingjtx.common.security.interceptor.UserContext;
import feign.*;
import feign.codec.Decoder;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Objects;

@Component
public class FeignAuthRequestInterceptor implements RequestInterceptor, Decoder {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        UserVo user = UserContext.getUser();
        if (Objects.nonNull(user)) {
            // 在请求头中添加 Authorization 信息
            requestTemplate.header("Authorization", user.getToken());
        }
    }

    @Override
    public Object decode(Response response, Type type) throws IOException, FeignException {
        // 1. 解析为 ResponseResult
        String body = Util.toString(response.body().asReader(Util.UTF_8));

        // 先判断数据有没有被 ResponseResult 包装
        JSONObject data = JSON.parseObject(body);
        if (!data.containsKey("code")) {
            // 直接返回数据（无 ResponseResult 包装）
            return JSON.parseObject(body, type);
        }

        if (ResponseCode.SUCCESS.getCode() != data.getInteger("code")) {
            throw new ResponseErrorException(data.getString("message"));
        }
        return data.getObject("data", type);

//        ResponseResult<?> responseResult = JSON.parseObject(body, ResponseResult.class);
//
//        // 2. 检查业务状态码
//        if (!responseResult.isSuccess()) {
//            throw new ResponseErrorException(responseResult.getMessage());
//        }
//
//        // 3. 提取 data 字段并反序列化
//        if (type instanceof ParameterizedType parameterizedType) {
//            Type dataType = parameterizedType.getActualTypeArguments()[0];
//
//            // 使用 TypeReference 处理复杂泛型
//            return JSON.parseObject(
//                    JSON.toJSONString(responseResult.getData()),
//                    new TypeReference<>() {
//                        @Override
//                        public Object parseObject(String text) {
//                            return dataType;
//                        }
//                    }
//            );
//        } else {
//            // 处理非泛型类型
//            return JSON.parseObject(JSON.toJSONString(responseResult.getData()), type);
//        }
    }
}
